package com.hzw.saas.common.pay.alipay.bean;

import java.util.Map;

import com.alibaba.fastjson.JSON;
import lombok.Getter;
import lombok.Setter;

/**
 * 支付宝 异步/同步 通知请求参数封装
 *
 * @author zzl
 * @since 2020-09-24
 */
@Getter
@Setter
public class AliNotifyResponse {

    // 变量命名与支付宝API保持一致

    /**
     * 支付宝交易凭证号
     */
    private String trade_no;

    /**
     * 开发者app_id
     */
    private String app_id;

    /**
     * 商户订单号
     */
    private String out_trade_no;

    /**
     * 商户业务 ID，主要是退款通知中返回退款申请的流水号
     */
    private String out_biz_no;

    /**
     * 买家支付宝账号对应的支付宝唯一用户号
     * 以 2088 开头的纯 16 位数字
     */
    private String buyer_id;

    /**
     * 卖家支付宝用户号
     */
    private String seller_id;

    /**
     * 交易目前所处的状态
     *
     * WAIT_BUYER_PAY   交易创建，等待买家付款
     * TRADE_CLOSED     未付款交易超时关闭，或支付完成后全额退款
     * TRADE_SUCCESS    交易支付成功
     * TRADE_FINISHED   交易结束，不可退款
     *
     * 注：TRADE_SUCCESS 的通知触发条件是商户签约的产品支持退款功能的前提下，买家付款成功
     *    TRADE_FINISHED 的通知触发条件是商户签约的产品不支持退款功能的前提下，买家付款成功；或者，商户签约的产品支持退款功能的前提下，交易已经成功并且已经超过可退款期限
     */
    private String trade_status;

    /**
     * 本次交易支付的订单金额
     * 单位为人民币（元），精确到小数点后2位
     */
    private String total_amount;

    /**
     * 商家在交易中实际收到的款项
     * 单位为元，精确到小数点后2位
     */
    private String receipt_amount;

    /**
     * 用户在交易中支付的可开发票的金额
     * 单位为元，精确到小数点后2位
     */
    private String invoice_amount;

    /**
     * 用户在交易中支付的金额
     * 单位为元，精确到小数点后2位
     */
    private String buyer_pay_amount;

    /**
     * 使用集分宝支付的金额
     * 单位为元，精确到小数点后2位
     */
    private String point_amount;

    /**
     * 退款通知中，返回总退款金额
     * 单位为元，精确到小数点后2位
     */
    private String refund_fee;

    /**
     * 订单标题
     * 商品的标题/交易标题/订单标题/订单关键字等，是请求时对应的参数，原样通知回来
     */
    private String subject;

    /**
     * 商品描述
     * 该订单的备注、描述、明细等。对应请求时的body参数，原样通知回来
     */
    private String body;

    /**
     * 交易创建时间
     * 格式为yyyy-MM-dd HH:mm:ss
     */
    private String gmt_create;

    /**
     * 交易付款时间
     * 格式为yyyy-MM-dd HH:mm:ss
     */
    private String gmt_payment;

    /**
     * 交易退款时间
     * 格式为yyyy-MM-dd HH:mm:ss.S
     */
    private String gmt_refund;

    /**
     * 交易结束时间
     */
    private String gmt_close;

    // TODO: ZZL@2020-09-24 补全参数

    private static AliNotifyResponse Convert(Map<String, String> params) {
        String paramsStr = JSON.toJSONString(params);
        return JSON.parseObject(paramsStr, AliNotifyResponse.class);
    }

}
